- Were any species found on all three islands? If so, which one(s).
Are the number of males and females in the data set roughly balanced for
each species? Note: the “table” command will be useful for this
problem.
# Packages
#install.packages("tidyverse") # hash once used
library(tidyverse)
library(ggplot2)
library(dplyr)
# Loading the data
penguins <- read.csv("penguins.csv")
table(penguins$species, penguins$sex)
female male
Adelie 73 73
Chinstrap 34 34
Gentoo 58 61
The Adelie and Chinstrap are perfectly balanced while the Gentoo is
roughly balanced (3 off)
- Make a side-by-side boxplot comparing bill length for males and
females. Do a t-test testing the null hypothesis that mean bill length
is the same for males and females. What is your conclusion? Make a
QQ-plot of bill length for males, make a separate QQ- plot of bill
length for females. Are the t-test conditions satisfied? Also do the
Wilcox- Mann-Whitney test. Do the t-test and Wilcox-Mann-Whitney test
agree?
# bill length males vs females
ggplot(penguins, aes(x = sex, y = bill_length_mm)) + geom_boxplot() + labs(title = "Bill Length by Sex", x = "Sex", y = "Bill Length (mm)")

# T-test
t_test <- t.test(bill_length_mm ~ sex, data = penguins)
print(t_test)
Welch Two Sample t-test
data: bill_length_mm by sex
t = -6.6725, df = 329.29, p-value = 1.066e-10
alternative hypothesis: true difference in means between group female and group male is not equal to 0
95 percent confidence interval:
-4.865676 -2.649908
sample estimates:
mean in group female mean in group male
42.09697 45.85476
# QQ plot
qqnorm(penguins$bill_length_mm[penguins$sex == "male"], main = "QQ Plot: Males")
qqline (penguins$bill_length_mm[penguins$sex == "male"])

qqnorm(penguins$bill_length_mm[penguins$sex == "female"], main = "QQ Plot: Females")
qqline(penguins$bill_length_mm[penguins$sex == "female"])

# Wilcox-Mann-Whitney test
wmw <- wilcox.test(bill_length_mm ~ sex, data = penguins)
print(wmw)
Wilcoxon rank sum test with continuity correction
data: bill_length_mm by sex
W = 8178, p-value = 9.901e-11
alternative hypothesis: true location shift is not equal to 0
Males have a statistically longer bill on average. Both tests
strongly reject the null hypothesis at a = 0.05. The t-test assumptions
are normal and robust with the Wilcoxon test confirming it. Overall, yes
both the t-test and the WMW test led to the same conclusion of males
having a confirmed larger beak size on average.
- Make a side-by-side boxplot comparing bill length for all three
species. Do a one-way ANOVA to test the null hypothesis that all three
specie have the same mean bill length. Show the ANOVA table. What is
your conclusion? Make a QQ-plot of the residuals. Make a plot of the
residuals vs. the group means. Are the ANOVA conditions satisfied?
# Species' boxplots
ggplot(penguins, aes(x = species, y = bill_length_mm)) + geom_boxplot() + labs(title = "Bill Length by Species", x = "Species", y = "Bill Length (mm)")

# ANOVA
anova_result <- aov(bill_length_mm ~ species, data = penguins)
summary (anova_result)
Df Sum Sq Mean Sq F value Pr(>F)
species 2 7015 3508 397.3 <2e-16 ***
Residuals 330 2914 9
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Residuals
residuals_anova <- residuals(anova_result)
qqnorm(residuals_anova)
qqline(residuals_anova)

group_means <- tapply(penguins$bill_length_mm, penguins$species, mean, na.rm=TRUE)
means_lookup <- setNames(group_means, names(group_means))
group_mean_values <- means_lookup[as.character(penguins$species)]
plot(group_mean_values, residuals(anova_result),
main = "Residuals vs Group Means", xlab = "Group Mean", ylab = "Residuals")

The ANOVA conditions appear to be satisfied because the QQ-plot of
residuals shows that the points are approximately linear (normal) and
the residuals vs group means plot doesnt have a clear pattern
(homoscedasticity) confirming there is a significant difference in mean
bill length among the three species.
- Make a side-by-side boxplot showing bill length as a function of
both sex and species. Do a two-way ANOVA. Show the ANOVA table. For a
two-way ANOVA there are three null hypotheses, what are your three
conclusions? Make a QQ-plot of the residuals. Make a plot of the
residuals vs. the group means. Are the ANOVA conditions satisfied?
ggplot(penguins, aes(x = species, y = bill_length_mm, fill = sex)) + geom_boxplot(position = position_dodge(0.8)) + labs(title = "Bill Length by Sex and Species", x = "Species", y = "Bill Length (mm)")

# 2-way ANOVA
two_way <- aov(bill_length_mm ~ species * sex, data = penguins)
summary(two_way)
Df Sum Sq Mean Sq F value Pr(>F)
species 2 7015 3508 654.189 <2e-16 ***
sex 1 1136 1136 211.807 <2e-16 ***
species:sex 2 24 12 2.284 0.103
Residuals 327 1753 5
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Checking residuals
residuals_two_way <- residuals(two_way)
qqnorm(residuals_two_way)
qqline(residuals_two_way)

plot(fitted(two_way), residuals_two_way, main = "Residuals vs Fitted (2-way ANOVA)", xlab = "Fitted Values", ylab= "Residuals")

We tested if there was no difference in bill length among species,
that was rejected as null due to p < 2e-16. We tested if there was no
difference in bill length among sexes, that was rejected as null due to
p < 2e-16. Then we tested if there was no interaction between species
and sex, which we didn’t reject as null because p = 0.103. The ANOVA
conditions appear to be satisfied because the QQ-plot of residuals shows
that the points are approximately linear (normal) and the residuals vs
group means plot doesnt have a clear pattern (homoscedasticity)
confirming there is a significant difference in mean bill length among
the three species.
- Make a scatter plot with bill length on the x-axis and bill depth on
the y-axis. Compute the correlation. Compute the least squares line, and
add the least squares line to your plot. Is the slope (and the
correlation) significantly different than zero? If so, does the sign of
the slope (and correlation) surprise you? Make a QQ-plot of the
residuals. Make a plot with bill length on the x-axis and the residuals
on the y-axis. Are the linear model assumptions satisfied?
# Scatter plot + LR for all species
ggplot(penguins, aes(x = bill_length_mm, y = bill_depth_mm)) + geom_point() + geom_smooth(method = "lm", se = FALSE) + labs(title = "Bill Length vs Bill Depth", x = "Bill Length (mm)", y = "Bill Depth (mm)")

cor(penguins$bill_length_mm, penguins$bill_depth_mm, use = "complete.obs")
[1] -0.2286256
lm_all <- lm(bill_depth_mm ~ bill_length_mm, data = penguins)
summary (lm_all)
Call:
lm(formula = bill_depth_mm ~ bill_length_mm, data = penguins)
Residuals:
Min 1Q Median 3Q Max
-4.1548 -1.4291 0.0122 1.3994 4.5004
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 20.78665 0.85417 24.335 < 2e-16 ***
bill_length_mm -0.08233 0.01927 -4.273 2.53e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.92 on 331 degrees of freedom
Multiple R-squared: 0.05227, Adjusted R-squared: 0.04941
F-statistic: 18.26 on 1 and 331 DF, p-value: 2.528e-05
# residuals
residuals_lm <- residuals(lm_all)
qqnorm(residuals_lm)
qqline(residuals_lm)

plot(penguins$bill_length_mm, residuals_lm, main = "Residuals vs Bill Length", xlab = "Bill Length (mm)", ylab = "Residuals")

We tested if the slope between bill length and bill depth was zero,
which was rejected as null because the p-value was 2.53e-05. We also
tested if the correlation was zero, and that was also rejected as null
due to the same p-value. The negative sign of both the slope and the
correlation was surprising, since we might expect longer bills to also
be deeper. The linear model assumptions appear to be satisfied because
the QQ-plot of residuals shows that the points are approximately linear
(normal), and the residuals vs bill length plot does not show any strong
curvature or spread (homoscedasticity). The color-coded plot by species
helps explain the surprising negative slope, since different species
have distinct bill shapes (e.g., Gentoo penguins have longer, shallower
bills while Chinstrap have shorter, deeper ones), which creates a
misleading negative trend across all species even if the trend within
each species is positive.
Next repeat everything in the previous paragraph, but just for the
species Adelie.
adelie <- filter(penguins, species == "Adelie")
ggplot(adelie, aes(x = bill_length_mm, y = bill_depth_mm)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Adelie: Bill Length vs Bill Depth", x = "Bill Length", y = "Bill Depth")

cor(adelie$bill_length_mm, adelie$bill_depth_mm, use = "complete.obs")
[1] 0.3858132
lm_adelie <- lm(bill_depth_mm ~ bill_length_mm, data = adelie)
summary(lm_adelie)
Call:
lm(formula = bill_depth_mm ~ bill_length_mm, data = adelie)
Residuals:
Min 1Q Median 3Q Max
-2.1487 -0.7926 -0.0842 0.5550 3.4990
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 11.48771 1.37010 8.385 4.23e-14 ***
bill_length_mm 0.17668 0.03521 5.018 1.51e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.129 on 144 degrees of freedom
Multiple R-squared: 0.1489, Adjusted R-squared: 0.1429
F-statistic: 25.18 on 1 and 144 DF, p-value: 1.515e-06
residuals_adelie <- residuals(lm_adelie)
qqnorm(residuals_adelie)
qqline(residuals_adelie)

plot(adelie$bill_length_mm, residuals_adelie,
main = "Adelie Residuals vs Bill Length", xlab = "Bill Length", ylab = "Residuals")

We tested if the slope between bill length and bill depth for Adelie
penguins was zero, which we rejected as null because the p-value was
1.51e-06. We also tested if the correlation was zero, which was rejected
as null since the correlation was 0.386 with a significant p-value. The
positive slope and correlation are not surprising for this species,
since it makes sense that longer bills would also be deeper. The linear
model assumptions appear to be satisfied because the QQ-plot of
residuals is approximately linear (normal), and the residuals vs bill
length plot shows no strong patterns or fanning (homoscedasticity).
Finally make another scatter plot with bill length on the x-axis and
bill depth on the y- axis. This plot should include all three species,
but the species should be color-coded (i.e., use one color for the
Adelie penguins, a second color for the Chinstrap penguins,1 and a third
color for the Gentoo penguins). Does this figure explain the surprising
observation about the sign of the slopes?
ggplot(penguins, aes(x = bill_length_mm, y = bill_depth_mm, color = species)) +
geom_point() +
labs(title = "Bill Dimensions by Species", x = "Bill Length", y = "Bill Depth")

Yes, this figure explains the surprising observation about the sign
of the slopes. When looking at all species together, there is a negative
correlation between bill length and bill depth. However, this is
misleading because each species occupies a distinct region in the plot.
For example, Gentoo penguins have longer but shallower bills, while
Chinstrap penguins have shorter but deeper bills. Within each species,
the trend is often positive, but when combined, the between-species
differences create a negative overall slope. This is an example of
Simpson’s paradox.
- What is the data set you have selected for your term paper? If you
want, you are welcome to discuss with me your progress on the term paper
before you turn it in. It is due the last day of classes on Friday, May
2.
Drug_induced_Autoimmunity_Prediction from UCI
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoxLiBXZXJlIGFueSBzcGVjaWVzIGZvdW5kIG9uIGFsbCB0aHJlZSBpc2xhbmRzPyBJZiBzbywgd2hpY2ggb25lKHMpLiBBcmUgdGhlIG51bWJlciBvZiBtYWxlcyBhbmQgZmVtYWxlcyBpbiB0aGUgZGF0YSBzZXQgcm91Z2hseSBiYWxhbmNlZCBmb3IgZWFjaCBzcGVjaWVzPyBOb3RlOiB0aGUg4oCcdGFibGXigJ0gY29tbWFuZCB3aWxsIGJlIHVzZWZ1bCBmb3IgdGhpcyBwcm9ibGVtLgpgYGB7cn0KIyBQYWNrYWdlcwojaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikgIyBoYXNoIG9uY2UgdXNlZApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQoKIyBMb2FkaW5nIHRoZSBkYXRhCnBlbmd1aW5zIDwtIHJlYWQuY3N2KCJwZW5ndWlucy5jc3YiKQoKdGFibGUocGVuZ3VpbnMkc3BlY2llcywgcGVuZ3VpbnMkc2V4KQpgYGAKVGhlIEFkZWxpZSBhbmQgQ2hpbnN0cmFwIGFyZSBwZXJmZWN0bHkgYmFsYW5jZWQgd2hpbGUgdGhlIEdlbnRvbyBpcyByb3VnaGx5IGJhbGFuY2VkICgzIG9mZikKCjIuIE1ha2UgYSBzaWRlLWJ5LXNpZGUgYm94cGxvdCBjb21wYXJpbmcgYmlsbCBsZW5ndGggZm9yIG1hbGVzIGFuZCBmZW1hbGVzLiBEbyBhIHQtdGVzdCB0ZXN0aW5nIHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCBtZWFuIGJpbGwgbGVuZ3RoIGlzIHRoZSBzYW1lIGZvciBtYWxlcyBhbmQgZmVtYWxlcy4gV2hhdCBpcyB5b3VyIGNvbmNsdXNpb24/IE1ha2UgYSBRUS1wbG90IG9mIGJpbGwgbGVuZ3RoIGZvciBtYWxlcywgbWFrZSBhIHNlcGFyYXRlIFFRLSBwbG90IG9mIGJpbGwgbGVuZ3RoIGZvciBmZW1hbGVzLiBBcmUgdGhlIHQtdGVzdCBjb25kaXRpb25zIHNhdGlzZmllZD8gQWxzbyBkbyB0aGUgV2lsY294LSBNYW5uLVdoaXRuZXkgdGVzdC4gRG8gdGhlIHQtdGVzdCBhbmQgV2lsY294LU1hbm4tV2hpdG5leSB0ZXN0IGFncmVlPwpgYGB7cn0KIyBiaWxsIGxlbmd0aCBtYWxlcyB2cyBmZW1hbGVzCmdncGxvdChwZW5ndWlucywgYWVzKHggPSBzZXgsIHkgPSBiaWxsX2xlbmd0aF9tbSkpICsgZ2VvbV9ib3hwbG90KCkgKyBsYWJzKHRpdGxlID0gIkJpbGwgTGVuZ3RoIGJ5IFNleCIsIHggPSAiU2V4IiwgeSA9ICJCaWxsIExlbmd0aCAobW0pIikKCiMgVC10ZXN0CnRfdGVzdCA8LSB0LnRlc3QoYmlsbF9sZW5ndGhfbW0gfiBzZXgsIGRhdGEgPSBwZW5ndWlucykKcHJpbnQodF90ZXN0KQoKIyBRUSBwbG90CnFxbm9ybShwZW5ndWlucyRiaWxsX2xlbmd0aF9tbVtwZW5ndWlucyRzZXggPT0gIm1hbGUiXSwgbWFpbiA9ICJRUSBQbG90OiBNYWxlcyIpCnFxbGluZSAocGVuZ3VpbnMkYmlsbF9sZW5ndGhfbW1bcGVuZ3VpbnMkc2V4ID09ICJtYWxlIl0pCnFxbm9ybShwZW5ndWlucyRiaWxsX2xlbmd0aF9tbVtwZW5ndWlucyRzZXggPT0gImZlbWFsZSJdLCBtYWluID0gIlFRIFBsb3Q6IEZlbWFsZXMiKQpxcWxpbmUocGVuZ3VpbnMkYmlsbF9sZW5ndGhfbW1bcGVuZ3VpbnMkc2V4ID09ICJmZW1hbGUiXSkKCiMgV2lsY294LU1hbm4tV2hpdG5leSB0ZXN0CndtdyA8LSB3aWxjb3gudGVzdChiaWxsX2xlbmd0aF9tbSB+IHNleCwgZGF0YSA9IHBlbmd1aW5zKQpwcmludCh3bXcpCmBgYApNYWxlcyBoYXZlIGEgc3RhdGlzdGljYWxseSBsb25nZXIgYmlsbCBvbiBhdmVyYWdlLiBCb3RoIHRlc3RzIHN0cm9uZ2x5IHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGF0IGEgPSAwLjA1LiBUaGUgdC10ZXN0IGFzc3VtcHRpb25zIGFyZSBub3JtYWwgYW5kIHJvYnVzdCB3aXRoIHRoZSBXaWxjb3hvbiB0ZXN0IGNvbmZpcm1pbmcgaXQuIE92ZXJhbGwsIHllcyBib3RoIHRoZSB0LXRlc3QgYW5kIHRoZSBXTVcgdGVzdCBsZWQgdG8gdGhlIHNhbWUgY29uY2x1c2lvbiBvZiBtYWxlcyBoYXZpbmcgYSBjb25maXJtZWQgbGFyZ2VyIGJlYWsgc2l6ZSBvbiBhdmVyYWdlLgoKMy4gTWFrZSBhIHNpZGUtYnktc2lkZSBib3hwbG90IGNvbXBhcmluZyBiaWxsIGxlbmd0aCBmb3IgYWxsIHRocmVlIHNwZWNpZXMuIERvIGEgb25lLXdheSBBTk9WQSB0byB0ZXN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCBhbGwgdGhyZWUgc3BlY2llIGhhdmUgdGhlIHNhbWUgbWVhbiBiaWxsIGxlbmd0aC4gU2hvdyB0aGUgQU5PVkEgdGFibGUuIFdoYXQgaXMgeW91ciBjb25jbHVzaW9uPyBNYWtlIGEgUVEtcGxvdCBvZiB0aGUgcmVzaWR1YWxzLiBNYWtlIGEgcGxvdCBvZiB0aGUgcmVzaWR1YWxzIHZzLiB0aGUgZ3JvdXAgbWVhbnMuIEFyZSB0aGUgQU5PVkEgY29uZGl0aW9ucyBzYXRpc2ZpZWQ/CmBgYHtyfQojIFNwZWNpZXMnIGJveHBsb3RzCmdncGxvdChwZW5ndWlucywgYWVzKHggPSBzcGVjaWVzLCB5ID0gYmlsbF9sZW5ndGhfbW0pKSArIGdlb21fYm94cGxvdCgpICsgbGFicyh0aXRsZSA9ICJCaWxsIExlbmd0aCBieSBTcGVjaWVzIiwgeCA9ICJTcGVjaWVzIiwgeSA9ICJCaWxsIExlbmd0aCAobW0pIikKCiMgQU5PVkEKYW5vdmFfcmVzdWx0IDwtIGFvdihiaWxsX2xlbmd0aF9tbSB+IHNwZWNpZXMsIGRhdGEgPSBwZW5ndWlucykKc3VtbWFyeSAoYW5vdmFfcmVzdWx0KQoKIyBSZXNpZHVhbHMKcmVzaWR1YWxzX2Fub3ZhIDwtIHJlc2lkdWFscyhhbm92YV9yZXN1bHQpCnFxbm9ybShyZXNpZHVhbHNfYW5vdmEpCnFxbGluZShyZXNpZHVhbHNfYW5vdmEpCmdyb3VwX21lYW5zIDwtIHRhcHBseShwZW5ndWlucyRiaWxsX2xlbmd0aF9tbSwgcGVuZ3VpbnMkc3BlY2llcywgbWVhbiwgbmEucm09VFJVRSkKbWVhbnNfbG9va3VwIDwtIHNldE5hbWVzKGdyb3VwX21lYW5zLCBuYW1lcyhncm91cF9tZWFucykpCmdyb3VwX21lYW5fdmFsdWVzIDwtIG1lYW5zX2xvb2t1cFthcy5jaGFyYWN0ZXIocGVuZ3VpbnMkc3BlY2llcyldCgpwbG90KGdyb3VwX21lYW5fdmFsdWVzLCByZXNpZHVhbHMoYW5vdmFfcmVzdWx0KSwKICAgICBtYWluID0gIlJlc2lkdWFscyB2cyBHcm91cCBNZWFucyIsIHhsYWIgPSAiR3JvdXAgTWVhbiIsIHlsYWIgPSAiUmVzaWR1YWxzIikKYGBgClRoZSBBTk9WQSBjb25kaXRpb25zIGFwcGVhciB0byBiZSBzYXRpc2ZpZWQgYmVjYXVzZSB0aGUgUVEtcGxvdCBvZiByZXNpZHVhbHMgc2hvd3MgdGhhdCB0aGUgcG9pbnRzIGFyZSBhcHByb3hpbWF0ZWx5IGxpbmVhciAobm9ybWFsKSBhbmQgdGhlIHJlc2lkdWFscyB2cyBncm91cCBtZWFucyBwbG90IGRvZXNudCBoYXZlIGEgY2xlYXIgcGF0dGVybiAoaG9tb3NjZWRhc3RpY2l0eSkgY29uZmlybWluZyB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gbWVhbiBiaWxsIGxlbmd0aCBhbW9uZyB0aGUgdGhyZWUgc3BlY2llcy4KCjQuIE1ha2UgYSBzaWRlLWJ5LXNpZGUgYm94cGxvdCBzaG93aW5nIGJpbGwgbGVuZ3RoIGFzIGEgZnVuY3Rpb24gb2YgYm90aCBzZXggYW5kIHNwZWNpZXMuIERvIGEgdHdvLXdheSBBTk9WQS4gU2hvdyB0aGUgQU5PVkEgdGFibGUuIEZvciBhIHR3by13YXkgQU5PVkEgdGhlcmUgYXJlIHRocmVlIG51bGwgaHlwb3RoZXNlcywgd2hhdCBhcmUgeW91ciB0aHJlZSBjb25jbHVzaW9ucz8gTWFrZSBhIFFRLXBsb3Qgb2YgdGhlIHJlc2lkdWFscy4gTWFrZSBhIHBsb3Qgb2YgdGhlIHJlc2lkdWFscyB2cy4gdGhlIGdyb3VwIG1lYW5zLiBBcmUgdGhlIEFOT1ZBIGNvbmRpdGlvbnMgc2F0aXNmaWVkPwpgYGB7cn0KZ2dwbG90KHBlbmd1aW5zLCBhZXMoeCA9IHNwZWNpZXMsIHkgPSBiaWxsX2xlbmd0aF9tbSwgZmlsbCA9IHNleCkpICsgZ2VvbV9ib3hwbG90KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC44KSkgKyBsYWJzKHRpdGxlID0gIkJpbGwgTGVuZ3RoIGJ5IFNleCBhbmQgU3BlY2llcyIsIHggPSAiU3BlY2llcyIsIHkgPSAiQmlsbCBMZW5ndGggKG1tKSIpCgojIDItd2F5IEFOT1ZBCnR3b193YXkgPC0gYW92KGJpbGxfbGVuZ3RoX21tIH4gc3BlY2llcyAqIHNleCwgZGF0YSA9IHBlbmd1aW5zKQpzdW1tYXJ5KHR3b193YXkpCgojIENoZWNraW5nIHJlc2lkdWFscwpyZXNpZHVhbHNfdHdvX3dheSA8LSByZXNpZHVhbHModHdvX3dheSkKcXFub3JtKHJlc2lkdWFsc190d29fd2F5KQpxcWxpbmUocmVzaWR1YWxzX3R3b193YXkpCgppbnRlcmFjdGlvbl9ncm91cHMgPC0gaW50ZXJhY3Rpb24ocGVuZ3VpbnMkc3BlY2llcywgcGVuZ3VpbnMkc2V4KQpncm91cF9tZWFuc18yd2F5IDwtIHRhcHBseShwZW5ndWlucyRiaWxsX2xlbmd0aF9tbSwgaW50ZXJhY3Rpb25fZ3JvdXBzLCBtZWFuLCBuYS5ybT1UUlVFKQptZWFuc19sb29rdXBfMndheSA8LSBzZXROYW1lcyhncm91cF9tZWFuc18yd2F5LCBuYW1lcyhncm91cF9tZWFuc18yd2F5KSkKZ3JvdXBfbWVhbl92YWx1ZXNfMndheSA8LSBtZWFuc19sb29rdXBfMndheVthcy5jaGFyYWN0ZXIoaW50ZXJhY3Rpb25fZ3JvdXBzKV0KCnBsb3QoZ3JvdXBfbWVhbl92YWx1ZXNfMndheSwgcmVzaWR1YWxzKHR3b193YXkpLAogICAgIG1haW4gPSAiUmVzaWR1YWxzIHZzIEdyb3VwIE1lYW5zIChUd28td2F5IEFOT1ZBKSIsIHhsYWIgPSAiR3JvdXAgTWVhbiIsIHlsYWIgPSAiUmVzaWR1YWxzIikKYGBgCldlIHRlc3RlZCBpZiB0aGVyZSB3YXMgbm8gZGlmZmVyZW5jZSBpbiBiaWxsIGxlbmd0aCBhbW9uZyBzcGVjaWVzLCB0aGF0IHdhcyByZWplY3RlZCBhcyBudWxsIGR1ZSB0byBwIDwgMmUtMTYuIFdlIHRlc3RlZCBpZiB0aGVyZSB3YXMgbm8gZGlmZmVyZW5jZSBpbiBiaWxsIGxlbmd0aCBhbW9uZyBzZXhlcywgdGhhdCB3YXMgcmVqZWN0ZWQgYXMgbnVsbCBkdWUgdG8gcCA8IDJlLTE2LiBUaGVuIHdlIHRlc3RlZCBpZiB0aGVyZSB3YXMgbm8gaW50ZXJhY3Rpb24gYmV0d2VlbiBzcGVjaWVzIGFuZCBzZXgsIHdoaWNoIHdlIGRpZG4ndCByZWplY3QgYXMgbnVsbCBiZWNhdXNlIHAgPSAwLjEwMy4gVGhlIEFOT1ZBIGNvbmRpdGlvbnMgYXBwZWFyIHRvIGJlIHNhdGlzZmllZCBiZWNhdXNlIHRoZSBRUS1wbG90IG9mIHJlc2lkdWFscyBzaG93cyB0aGF0IHRoZSBwb2ludHMgYXJlIGFwcHJveGltYXRlbHkgbGluZWFyIChub3JtYWwpIGFuZCB0aGUgcmVzaWR1YWxzIHZzIGdyb3VwIG1lYW5zIHBsb3QgZG9lc250IGhhdmUgYSBjbGVhciBwYXR0ZXJuIChob21vc2NlZGFzdGljaXR5KSBjb25maXJtaW5nIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBtZWFuIGJpbGwgbGVuZ3RoIGFtb25nIHRoZSB0aHJlZSBzcGVjaWVzLgoKNS4gTWFrZSBhIHNjYXR0ZXIgcGxvdCB3aXRoIGJpbGwgbGVuZ3RoIG9uIHRoZSB4LWF4aXMgYW5kIGJpbGwgZGVwdGggb24gdGhlIHktYXhpcy4gQ29tcHV0ZSB0aGUgY29ycmVsYXRpb24uIENvbXB1dGUgdGhlIGxlYXN0IHNxdWFyZXMgbGluZSwgYW5kIGFkZCB0aGUgbGVhc3Qgc3F1YXJlcyBsaW5lIHRvIHlvdXIgcGxvdC4gSXMgdGhlIHNsb3BlIChhbmQgdGhlIGNvcnJlbGF0aW9uKSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCB0aGFuIHplcm8/IElmIHNvLCBkb2VzIHRoZSBzaWduIG9mIHRoZSBzbG9wZSAoYW5kIGNvcnJlbGF0aW9uKSBzdXJwcmlzZSB5b3U/IE1ha2UgYSBRUS1wbG90IG9mIHRoZSByZXNpZHVhbHMuIE1ha2UgYSBwbG90IHdpdGggYmlsbCBsZW5ndGggb24gdGhlIHgtYXhpcyBhbmQgdGhlIHJlc2lkdWFscyBvbiB0aGUgeS1heGlzLiBBcmUgdGhlIGxpbmVhciBtb2RlbCBhc3N1bXB0aW9ucyBzYXRpc2ZpZWQ/CmBgYHtyfQojIFNjYXR0ZXIgcGxvdCArIExSIGZvciBhbGwgc3BlY2llcwpnZ3Bsb3QocGVuZ3VpbnMsIGFlcyh4ID0gYmlsbF9sZW5ndGhfbW0sIHkgPSBiaWxsX2RlcHRoX21tKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArIGxhYnModGl0bGUgPSAiQmlsbCBMZW5ndGggdnMgQmlsbCBEZXB0aCIsIHggPSAiQmlsbCBMZW5ndGggKG1tKSIsIHkgPSAiQmlsbCBEZXB0aCAobW0pIikKY29yKHBlbmd1aW5zJGJpbGxfbGVuZ3RoX21tLCBwZW5ndWlucyRiaWxsX2RlcHRoX21tLCB1c2UgPSAiY29tcGxldGUub2JzIikKbG1fYWxsIDwtIGxtKGJpbGxfZGVwdGhfbW0gfiBiaWxsX2xlbmd0aF9tbSwgZGF0YSA9IHBlbmd1aW5zKQpzdW1tYXJ5IChsbV9hbGwpCgojIHJlc2lkdWFscwpyZXNpZHVhbHNfbG0gPC0gcmVzaWR1YWxzKGxtX2FsbCkKcXFub3JtKHJlc2lkdWFsc19sbSkKcXFsaW5lKHJlc2lkdWFsc19sbSkKCnBsb3QocGVuZ3VpbnMkYmlsbF9sZW5ndGhfbW0sIHJlc2lkdWFsc19sbSwgbWFpbiA9ICJSZXNpZHVhbHMgdnMgQmlsbCBMZW5ndGgiLCB4bGFiID0gIkJpbGwgTGVuZ3RoIChtbSkiLCB5bGFiID0gIlJlc2lkdWFscyIpCmBgYApXZSB0ZXN0ZWQgaWYgdGhlIHNsb3BlIGJldHdlZW4gYmlsbCBsZW5ndGggYW5kIGJpbGwgZGVwdGggd2FzIHplcm8sIHdoaWNoIHdhcyByZWplY3RlZCBhcyBudWxsIGJlY2F1c2UgdGhlIHAtdmFsdWUgd2FzIDIuNTNlLTA1LiBXZSBhbHNvIHRlc3RlZCBpZiB0aGUgY29ycmVsYXRpb24gd2FzIHplcm8sIGFuZCB0aGF0IHdhcyBhbHNvIHJlamVjdGVkIGFzIG51bGwgZHVlIHRvIHRoZSBzYW1lIHAtdmFsdWUuIFRoZSBuZWdhdGl2ZSBzaWduIG9mIGJvdGggdGhlIHNsb3BlIGFuZCB0aGUgY29ycmVsYXRpb24gd2FzIHN1cnByaXNpbmcsIHNpbmNlIHdlIG1pZ2h0IGV4cGVjdCBsb25nZXIgYmlsbHMgdG8gYWxzbyBiZSBkZWVwZXIuIFRoZSBsaW5lYXIgbW9kZWwgYXNzdW1wdGlvbnMgYXBwZWFyIHRvIGJlIHNhdGlzZmllZCBiZWNhdXNlIHRoZSBRUS1wbG90IG9mIHJlc2lkdWFscyBzaG93cyB0aGF0IHRoZSBwb2ludHMgYXJlIGFwcHJveGltYXRlbHkgbGluZWFyIChub3JtYWwpLCBhbmQgdGhlIHJlc2lkdWFscyB2cyBiaWxsIGxlbmd0aCBwbG90IGRvZXMgbm90IHNob3cgYW55IHN0cm9uZyBjdXJ2YXR1cmUgb3Igc3ByZWFkIChob21vc2NlZGFzdGljaXR5KS4gVGhlIGNvbG9yLWNvZGVkIHBsb3QgYnkgc3BlY2llcyBoZWxwcyBleHBsYWluIHRoZSBzdXJwcmlzaW5nIG5lZ2F0aXZlIHNsb3BlLCBzaW5jZSBkaWZmZXJlbnQgc3BlY2llcyBoYXZlIGRpc3RpbmN0IGJpbGwgc2hhcGVzIChlLmcuLCBHZW50b28gcGVuZ3VpbnMgaGF2ZSBsb25nZXIsIHNoYWxsb3dlciBiaWxscyB3aGlsZSBDaGluc3RyYXAgaGF2ZSBzaG9ydGVyLCBkZWVwZXIgb25lcyksIHdoaWNoIGNyZWF0ZXMgYSBtaXNsZWFkaW5nIG5lZ2F0aXZlIHRyZW5kIGFjcm9zcyBhbGwgc3BlY2llcyBldmVuIGlmIHRoZSB0cmVuZCB3aXRoaW4gZWFjaCBzcGVjaWVzIGlzIHBvc2l0aXZlLgoKTmV4dCByZXBlYXQgZXZlcnl0aGluZyBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLCBidXQganVzdCBmb3IgdGhlIHNwZWNpZXMgQWRlbGllLgpgYGB7cn0KYWRlbGllIDwtIGZpbHRlcihwZW5ndWlucywgc3BlY2llcyA9PSAiQWRlbGllIikKCmdncGxvdChhZGVsaWUsIGFlcyh4ID0gYmlsbF9sZW5ndGhfbW0sIHkgPSBiaWxsX2RlcHRoX21tKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnModGl0bGUgPSAiQWRlbGllOiBCaWxsIExlbmd0aCB2cyBCaWxsIERlcHRoIiwgeCA9ICJCaWxsIExlbmd0aCIsIHkgPSAiQmlsbCBEZXB0aCIpCgpjb3IoYWRlbGllJGJpbGxfbGVuZ3RoX21tLCBhZGVsaWUkYmlsbF9kZXB0aF9tbSwgdXNlID0gImNvbXBsZXRlLm9icyIpCgpsbV9hZGVsaWUgPC0gbG0oYmlsbF9kZXB0aF9tbSB+IGJpbGxfbGVuZ3RoX21tLCBkYXRhID0gYWRlbGllKQpzdW1tYXJ5KGxtX2FkZWxpZSkKCnJlc2lkdWFsc19hZGVsaWUgPC0gcmVzaWR1YWxzKGxtX2FkZWxpZSkKcXFub3JtKHJlc2lkdWFsc19hZGVsaWUpCnFxbGluZShyZXNpZHVhbHNfYWRlbGllKQoKcGxvdChhZGVsaWUkYmlsbF9sZW5ndGhfbW0sIHJlc2lkdWFsc19hZGVsaWUsCiAgICAgbWFpbiA9ICJBZGVsaWUgUmVzaWR1YWxzIHZzIEJpbGwgTGVuZ3RoIiwgeGxhYiA9ICJCaWxsIExlbmd0aCIsIHlsYWIgPSAiUmVzaWR1YWxzIikKYGBgCldlIHRlc3RlZCBpZiB0aGUgc2xvcGUgYmV0d2VlbiBiaWxsIGxlbmd0aCBhbmQgYmlsbCBkZXB0aCBmb3IgQWRlbGllIHBlbmd1aW5zIHdhcyB6ZXJvLCB3aGljaCB3ZSByZWplY3RlZCBhcyBudWxsIGJlY2F1c2UgdGhlIHAtdmFsdWUgd2FzIDEuNTFlLTA2LiBXZSBhbHNvIHRlc3RlZCBpZiB0aGUgY29ycmVsYXRpb24gd2FzIHplcm8sIHdoaWNoIHdhcyByZWplY3RlZCBhcyBudWxsIHNpbmNlIHRoZSBjb3JyZWxhdGlvbiB3YXMgMC4zODYgd2l0aCBhIHNpZ25pZmljYW50IHAtdmFsdWUuIFRoZSBwb3NpdGl2ZSBzbG9wZSBhbmQgY29ycmVsYXRpb24gYXJlIG5vdCBzdXJwcmlzaW5nIGZvciB0aGlzIHNwZWNpZXMsIHNpbmNlIGl0IG1ha2VzIHNlbnNlIHRoYXQgbG9uZ2VyIGJpbGxzIHdvdWxkIGFsc28gYmUgZGVlcGVyLiBUaGUgbGluZWFyIG1vZGVsIGFzc3VtcHRpb25zIGFwcGVhciB0byBiZSBzYXRpc2ZpZWQgYmVjYXVzZSB0aGUgUVEtcGxvdCBvZiByZXNpZHVhbHMgaXMgYXBwcm94aW1hdGVseSBsaW5lYXIgKG5vcm1hbCksIGFuZCB0aGUgcmVzaWR1YWxzIHZzIGJpbGwgbGVuZ3RoIHBsb3Qgc2hvd3Mgbm8gc3Ryb25nIHBhdHRlcm5zIG9yIGZhbm5pbmcgKGhvbW9zY2VkYXN0aWNpdHkpLgoKCkZpbmFsbHkgbWFrZSBhbm90aGVyIHNjYXR0ZXIgcGxvdCB3aXRoIGJpbGwgbGVuZ3RoIG9uIHRoZSB4LWF4aXMgYW5kIGJpbGwgZGVwdGggb24gdGhlIHktIGF4aXMuIFRoaXMgcGxvdCBzaG91bGQgaW5jbHVkZSBhbGwgdGhyZWUgc3BlY2llcywgYnV0IHRoZSBzcGVjaWVzIHNob3VsZCBiZSBjb2xvci1jb2RlZCAoaS5lLiwgdXNlIG9uZSBjb2xvciBmb3IgdGhlIEFkZWxpZSBwZW5ndWlucywgYSBzZWNvbmQgY29sb3IgZm9yIHRoZSBDaGluc3RyYXAgcGVuZ3VpbnMsMSBhbmQgYSB0aGlyZCBjb2xvciBmb3IgdGhlIEdlbnRvbyBwZW5ndWlucykuIERvZXMgdGhpcyBmaWd1cmUgZXhwbGFpbiB0aGUgc3VycHJpc2luZyBvYnNlcnZhdGlvbiBhYm91dCB0aGUgc2lnbiBvZiB0aGUgc2xvcGVzPwpgYGB7cn0KZ2dwbG90KHBlbmd1aW5zLCBhZXMoeCA9IGJpbGxfbGVuZ3RoX21tLCB5ID0gYmlsbF9kZXB0aF9tbSwgY29sb3IgPSBzcGVjaWVzKSkgKwogIGdlb21fcG9pbnQoKSArCiAgbGFicyh0aXRsZSA9ICJCaWxsIERpbWVuc2lvbnMgYnkgU3BlY2llcyIsIHggPSAiQmlsbCBMZW5ndGgiLCB5ID0gIkJpbGwgRGVwdGgiKQpgYGAKWWVzLCB0aGlzIGZpZ3VyZSBleHBsYWlucyB0aGUgc3VycHJpc2luZyBvYnNlcnZhdGlvbiBhYm91dCB0aGUgc2lnbiBvZiB0aGUgc2xvcGVzLiBXaGVuIGxvb2tpbmcgYXQgYWxsIHNwZWNpZXMgdG9nZXRoZXIsIHRoZXJlIGlzIGEgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBiaWxsIGxlbmd0aCBhbmQgYmlsbCBkZXB0aC4gSG93ZXZlciwgdGhpcyBpcyBtaXNsZWFkaW5nIGJlY2F1c2UgZWFjaCBzcGVjaWVzIG9jY3VwaWVzIGEgZGlzdGluY3QgcmVnaW9uIGluIHRoZSBwbG90LiBGb3IgZXhhbXBsZSwgR2VudG9vIHBlbmd1aW5zIGhhdmUgbG9uZ2VyIGJ1dCBzaGFsbG93ZXIgYmlsbHMsIHdoaWxlIENoaW5zdHJhcCBwZW5ndWlucyBoYXZlIHNob3J0ZXIgYnV0IGRlZXBlciBiaWxscy4gV2l0aGluIGVhY2ggc3BlY2llcywgdGhlIHRyZW5kIGlzIG9mdGVuIHBvc2l0aXZlLCBidXQgd2hlbiBjb21iaW5lZCwgdGhlIGJldHdlZW4tc3BlY2llcyBkaWZmZXJlbmNlcyBjcmVhdGUgYSBuZWdhdGl2ZSBvdmVyYWxsIHNsb3BlLiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgU2ltcHNvbuKAmXMgcGFyYWRveC4KCjYuIFdoYXQgaXMgdGhlIGRhdGEgc2V0IHlvdSBoYXZlIHNlbGVjdGVkIGZvciB5b3VyIHRlcm0gcGFwZXI/IElmIHlvdSB3YW50LCB5b3UgYXJlIHdlbGNvbWUgdG8gZGlzY3VzcyB3aXRoIG1lIHlvdXIgcHJvZ3Jlc3Mgb24gdGhlIHRlcm0gcGFwZXIgYmVmb3JlIHlvdSB0dXJuIGl0IGluLiBJdCBpcyBkdWUgdGhlIGxhc3QgZGF5IG9mIGNsYXNzZXMgb24gRnJpZGF5LCBNYXkgMi4KCkRydWdfaW5kdWNlZF9BdXRvaW1tdW5pdHlfUHJlZGljdGlvbiBmcm9tIFVDSQo=